
package com.bei_en.teacher.management.shiro;

import java.security.Key;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.codec.H64;
import org.apache.shiro.codec.Hex;
import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.Md5Hash;
import com.bei_en.teacher.management.model.system.vo.SystemUserVo;

/**
 *
 * <p>Description: 加密工具类</p>
 * <p>Company: 静之殇工作室</p>
 * @author wjggwm
 * @date 2016年1月5日 下午11:14:20
 */
public class EndecryptUtils {

    /**
    * base64进制加密
    *
    * @param password
    * @return
    */
    public static String encrytBase64(String password) {

	byte[] bytes = password.getBytes();
	return Base64.encodeToString(bytes);
    }

    /**
     * base64进制解密
     * @param cipherText
     * @return
     */
    public static String decryptBase64(String cipherText) {

	return Base64.decodeToString(cipherText);
    }

    /**
     * 16进制加密
     *
     * @param password
     * @return
     */
    public static String encrytHex(String password) {

	byte[] bytes = password.getBytes();
	return Hex.encodeToString(bytes);
    }

    /**
     * 16进制解密
     * @param cipherText
     * @return
     */
    public static String decryptHex(String cipherText) {

	return new String(Hex.decode(cipherText));
    }

    public static String generateKey() {

	AesCipherService aesCipherService = new AesCipherService();
	Key key = aesCipherService.generateNewKey();
	return Base64.encodeToString(key.getEncoded());
    }

    /**
     * 对密码进行md5加密,并返回密文和salt，包含在User对象中
     * @param username 用户名
     * @param password 密码
     * @param hashIterations 迭代次数
     * @return UserEntity对象，包含密文和salt
     */
    public static SystemUserVo md5Password(String username, String password, int hashIterations) {

	SecureRandomNumberGenerator secureRandomNumberGenerator = new SecureRandomNumberGenerator();
	String salt = secureRandomNumberGenerator.nextBytes().toHex();
	// 组合username,两次迭代，对密码进行加密
	String password_cryto = new Md5Hash(password, username+salt, hashIterations).toBase64();
	SystemUserVo user = new SystemUserVo();
	user.setPassword(password_cryto);
	user.setSalt(salt);
	user.setName(username);
	return user;
    }

    public static void main(String[] args) {

	String password = "admin";
	String cipherText = encrytHex(password);
	System.out.println(password+"hex加密之后的密文是："+cipherText);
	String decrptPassword = decryptHex(cipherText);
	System.out.println(cipherText+"hex解密之后的密码是："+decrptPassword);
	String cipherText_base64 = encrytBase64(password);
	System.out.println(password+"base64加密之后的密文是："+cipherText_base64);
	String decrptPassword_base64 = decryptBase64(cipherText_base64);
	System.out.println(cipherText_base64+"base64解密之后的密码是："+decrptPassword_base64);
	String h64 = H64.encodeToString(password.getBytes());
	System.out.println(h64);
	String salt = "7road";
	String cipherText_md5 = new Md5Hash(password, salt, 4).toHex();
	System.out.println(password+"通过md5加密之后的密文是："+cipherText_md5);
	System.out.println(generateKey());
	System.out.println("==========================================================");
	AesCipherService aesCipherService = new AesCipherService();
	aesCipherService.setKeySize(128);
	Key key = aesCipherService.generateNewKey();
	String aes_cipherText = aesCipherService.encrypt(password.getBytes(), key.getEncoded())
		.toHex();
	System.out.println(password+" aes加密的密文是："+aes_cipherText);
	String aes_mingwen = new String(aesCipherService.decrypt(Hex.decode(aes_cipherText),
		key.getEncoded()).getBytes());
	System.out.println(aes_cipherText+" aes解密的明文是："+aes_mingwen);
    }
}
